﻿--lua script
--本脚本实现了死亡后选择复活模式的功能
--先执行OnKillByActor 再执行defaultHandlerPlayerDie

--#include "data\functions\ExpandFunc\ActorReliveCommon.lua" once
--#include "data\functions\Activity\PKChallenge\PKChallengeCommon.lua" once
--#include "data\functions\player.lua" once -- 角色处理
--#include "data\functions\Activity\Dart\ApplyDartCommon.lua"
--#include "data\functions\ActorEvent\ActorFoeHandle.lua"
--#include "data\functions\Activity\Escort\Escort.lua" once

--#include "data\functions\Guild\GuildSbkWar.lua"  once  

--#include "data\functions\Cross\CrossLeagueMatches.lua" once				--跨服联赛
--#include "data\functions\Cross\CrossEatChicken.lua" once					--跨服吃鸡

-- 判断杀人者是否是玩家
-- incself: 杀人者是否可以是自己。如果为true，杀人者是自己也返回true；否则返回false
EventCallDispatcher.IsKillerActor = function (sysarg, killer, incself)	
	incself = incself or false
	local entity_type = Actor.getEntityType(killer)	
	if (entity_type ~= 0) then
		return false
	end
	
	if ((not incself) and (sysarg == killer)) then		
		return false		
	end
	return true
end


--[[
    函数名称：EventCallDispatcher.OnKillByActor
    函数描述：玩家被玩家杀死调用
    参数 sysarg 的描述：  被杀玩家对象指针 
    参数 killer 的描述：杀死该玩家的对象的指针
    参数 ... 的描述：
]]
EventCallDispatcher.OnKillByActor = function (sysarg, killer)
	--print("OnKillByActor ...")
	--[[
	if (not sysarg or not killer) then return end 
	if (not EventCallDispatcher.IsKillerActor(sysarg, killer[1])) then 
		print("----killed by non actor-----")
		return 
	end
	--]]
	local killerPtr = killer[1]
	if not killerPtr or not sysarg then return end 
	
	local svar = Actor.getStaticVar(sysarg)
	local data = svar.killerData	--被击杀者记录被杀信息
	if not data then 
		svar.killerData = {}
		data = svar.killerData
	end	
	local entity_type = Actor.getEntityType(killerPtr)
	if entity_type == 0 then
		data[1] = Actor.getIntProperty(killerPtr, PROP_CREATURE_LEVEL)	--击杀者等级
		data[2] = Actor.getCampId(killerPtr)	--击杀者阵营ID
		data[3] = Actor.getName(killerPtr)	--击杀者名字
		data[6] = entity_type --击杀者类型
		if sysarg ~= killerPtr then	
			--[[  屏蔽以前活动死亡触发
			BuLuoBattleActorDeath(sysarg, killerPtr)			--阵营战场
			OnPKChallengePlyDeath( sysarg, killerPtr )		--Pk挑战
			OnKilledInHunting(sysarg, killerPtr)			--狩猎大会
			
			ActorKillOtherGetScore(sysarg,killerPtr)		--战队竞技

			if System.isCommonServer() == true then			--如果是公共服 天下第一战场
				OnKillInCrossWorld(sysarg,killerPtr)
			end

			]]
			--[[
			local sceneId = Actor.getSceneId(killerPtr)
			local questEventId = PVPQuest[sceneId]
			if questEventId then
				if Actor.getCampId(killerPtr) ~= Actor.getCampId(sysarg) then
					Actor.triggerQuestEvent(killerPtr, 127, questEventId, 1)
				end
			end
			]]
			--处理下仇人列表
			OnKillActor(sysarg, killerPtr)

			OnKillActorDropLuck(sysarg, killerPtr)
		end
		
	elseif entity_type == 1 then
		data[3] = Actor.getName(killerPtr)	--击杀者名字
		data[6] = entity_type  --击杀者类型
	else
		data[6] = 2  --击杀者类型 其他类型
	end

	--沙巴克城战杀人
	OnSbkActorKillPlayers(killerPtr, sysarg)
	
	-- 处理玩家死亡
	OnPlayerDie(sysarg, killerPtr)

	-- 处理玩家死亡
	OnEscortPlayerDie(sysarg, killerPtr)

	if SceneDieDispatcher.dispatch( sysarg, killerPtr )	then			--被击杀的回调
		return
	end
end

--[[
    函数名称：EventCallDispatcher.defaultHandlerPlayerDie
    函数描述：角色死亡调用
    参数 sysarg 的描述：杀死该玩家的对象的指针
    参数 ... 的描述：

 注意：EventCallDispatcher.OnKillByActor()先于EventCallDispatcher.defaultHandlerPlayerDie()执行
]]
EventCallDispatcher.defaultHandlerPlayerDie = function (sysarg, arg)
	--判断玩家是否在擂台 没有则返回0
	local ChallengeId = Actor.getChallenge(sysarg)
	if (ChallengeId ~= 0) then 		--目前此分支没用
		local Status = ChallengeFun.getChallengeStatus(ChallengeId)
		if (Status == csReady or Status == csFight or Status == csEnd) then 
			OnKillPlayerChallenge( sysarg, arg, ChallengeId ) 
		else
			Actor.setReliveTimeOut(sysarg,ReliveConfig.reliveTime)
			OpenReliveDialog(sysarg, ReliveConfig.reliveTime)
		end
	else 		--通常进入这里
		if IsInCombineArena( sysarg ) or IsInCombineArenaFight( sysarg ) then	--合服擂台、大乱斗场景中，复活时限不同
			--print("defaultHandlerPlayerDie xxx1")
			Actor.setReliveTimeOut(sysarg, CombineServerArenaCfg.arena.reliveTime)
			OpenReliveDialog(sysarg, CombineServerArenaCfg.arena.reliveTime)
		elseif IsInBoodFightScene( sysarg ) or IsInSkyTowerFuben( sysarg ) then 		--部分场景，不打开复活面板
			--print("defaultHandlerPlayerDie xxx2")
		elseif IsInCrossLeagueFuben(sysarg) then
			Actor.setReliveTimeOut(sysarg, CrossLeagueMatchesCfg.reliveTime)
			OpenReliveDialog(sysarg, CrossLeagueMatchesCfg.reliveTime)
		elseif IsInCrossEatChickenFuben(sysarg) then
			Actor.setReliveTimeOut(sysarg, CrossEatChickenCfg.reliveTime)
			--OpenReliveDialog(sysarg, CrossEatChickenCfg.reliveTime)
		else
			--print("defaultHandlerPlayerDie xxx3")
			Actor.setReliveTimeOut(sysarg,ReliveConfig.reliveTime)
			OpenReliveDialog(sysarg, ReliveConfig.reliveTime)
		end
	end
	
	local var = Actor.getStaticVar(sysarg);
	if var.ybstate == 1 then	--目前此分支没用
		OnActorDartFailed(sysarg, StdActivityCfg[4].DartSetup.CampDartFailBeLoot)
	end

	OnSbkActorDead(sysarg)  --攻城战玩家死亡

	--dispatch触发方法中可能有离开场景的操作，这样确保先判断场景，再执行切换场景
	if SceneDeathDispatcher.dispatch( sysarg )	then			--死亡的回调
		return
	end
end



EventCallDispatcher.registerEventCall(BaseTypes.ActorEventId.aeOnActorBeKilled, EventCallDispatcher.OnKillByActor)
EventCallDispatcher.registerEventCall(BaseTypes.ActorEventId.aeOnActorDeath, EventCallDispatcher.defaultHandlerPlayerDie)
EventCallDispatcher.registerEventCall(BaseTypes.ActorEventId.aeReliveTimeOut, safeResurrection)
